package com.run_java_test.jar_local_run.controller;

import com.run_java_test.jar_local_run.service.DynamicJarLoaderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.*;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@RequestMapping("test_jars_load_to_spring")
@RestController
public class JarFileLoadToSpringController {

    // jar 包的磁盘位置
    private final static String youJarPath = "D:\\a_3software_cache\\idea_project\\self_project\\java_study_springboot_run_java_source_code\\uploads\\sp33_jar-1.jar";

    private final ApplicationContext applicationContext;
    private final DynamicJarLoaderService dynamicJarLoaderService;

    @Autowired
    public JarFileLoadToSpringController(
            ApplicationContext applicationContext,
            DynamicJarLoaderService dynamicJarLoaderService
    ) {
        this.applicationContext = applicationContext;
        this.dynamicJarLoaderService = dynamicJarLoaderService;
    }

    // 测试加载jar文件加载到spring, 处理依赖, 可执行, 可卸载, 可重新加载
    @GetMapping("test_jar_load")
    public String test_jar_load() throws Exception {
        // 设置jar包的磁盘位置
        dynamicJarLoaderService.loadJar(youJarPath);
        System.out.println("加载完成");
        return "加载完成";
    }

    // 测试获取调用bean中的方法, 因为当前的 只是注入controller到容器,
    // 但是没有设置端点映射到方法上方, 所以无法请求controller中的端点然后访问方法
    @GetMapping("test_jar_bean_method")
    public String test_jar_bean_method() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Object jarController = applicationContext.getBean("jarController");
        // 获取 jarController 中的 jar 方法
        Method jarMethod = jarController.getClass().getMethod("jar");
        // 调用 jar 方法
        Object result = jarMethod.invoke(jarController);
        // 打印结果
        System.out.println("调用结果: " + result);
        return "请求bean中的方法完成";
    }

    // 卸载从jar中注册的所有bean
    @GetMapping("test_jar_bean_unload")
    public String test_jar_bean_unload() {
        dynamicJarLoaderService.unloadJar();
        System.out.println("卸载jar中的bean代码完成");
        return "卸载jar中的bean代码完成";
    }

}
